#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
#include <sstream>
#include "fun.h"
using namespace std;
//string Tlog[4];       //Tablica globalna dziennika                 [0] - nr linii, [1] - ID, [2] - treść.

    char Log[] = "b_logentry";
    char kom[] = "//";
    char Dself[] = "self";             //Tablica zmiennej self.
    char Dother[] = "other";           //Tablica zmiennej other.
    char dialog[] = "ai_output";       //Tablica polecenia AI_Output.
    char Adialog[] = "info_addchoice";
    char Idialog[] = "description";    //Tablica polecenia description.


    string Slog;
    string Skom;
    string Nzmienna; //Strumień polecenia description.
    string Sosoba;
    string Sadialog;
    string Idescription;

    //int llog = 0;         //Licznik logów.
    //int linia =0;         //Licznik linii.

/////////////////////////////////////////
template <typename T>             //
string toStr(const T& x)          //
{                                 //
      std::ostringstream oss;     // funkcja zmieniająca int na string.
      oss << x;                   //
      return oss.str();           //
}                                 //
////////////////////////////////////////

//-------------------------------------------- Szukanie logów -------------------------------------------------------

void findLogEntry (fstream &Strm, char &Znak, string Tlog[], int &linia, int &llog, int &Llog, int parm)
{
    for(int i=0; i!=10;)
    {
        if(tolower(Znak)==Log[i]) //Porównuje wczytany znak przekonwertowany na mały z źródłem z tablicy.
        {
            if (parm==0||parm==2) Slog = Slog+Znak; //Jeżeli szuka treści oryginalnej lub tłumaczeń
            Strm >> Znak;
            i++;
        }
        else
        {
            if (parm==0||parm==2) Slog=""; //Jeżeli szuka treści oryginalnej lub tłumaczeń
            break;
        }
        if (i==10)
        {
            if (parm ==1) //Jeżeli liczy
            {
                Llog++;
            }
            else if (parm==0||parm==2) //Jeżeli szuka treści oryginalnej lub tłumaczeń
            {
                if (parm==0) //Jeżeli szuka treści oryginalnej.
                {
                    Tlog[1] = Slog;
                    Tlog[0] = toStr<int>(linia);
                    llog++; //Zlicza Logi.
                }

//Znaleciono Log więc szuka cudzysłowiu.

                for(int c=0; Znak!=';'&&Znak!='\n';)
                {
                    if (Znak=='"')//Znalazł cudzysłów zaczyna czytać treść.
                    {
                        Strm>>Znak;
                        for(int g=0; Znak!='"'&&Znak!=')'&&Znak!='\n';)//Kończy czytać jak spotka cudzysłów przecinek lub koniec linii.
                        {
                            if (parm==0) Tlog[2]=Tlog[2]+Znak; //Jeżeli szuka treści oryginalnej
                            else if (parm==2) Tlog[3]=Tlog[3]+Znak; //Jeżeli szuka tłumaczeń
                            Strm >> Znak;
                        }
                    }
                    else
                    {
                        Strm >> Znak;
                    }
                }
            }
        }
    }
}

//-------------------------------------------- Szukanie dialogów -------------------------------------------------------

void findAiOutput (fstream &Strm, char &Znak, int &linia, int &lout, int &looth, int &losel, int &Ldialog, string Tdialogi[], int parm)
{
    for(int i=0; i!=9;)
    {
        if(tolower(Znak)==dialog[i]) //Porównuje wczytany znak przekonwertowany na mały z źródłem z tablicy.
        {
            if (parm == 0||parm==2) Nzmienna = Nzmienna+Znak; //Jeżeli znaki pasują zapisuje je do strumienia.
            Strm >> Znak;
            i++;
        }
        else
        {
            if (parm == 0||parm==2) Nzmienna="";
            break;
        }
        if (i==9)
        {
            if (parm==1)Ldialog++;
            else if (parm == 0||parm==2)
            {
                if (parm==0)
                {
                    Tdialogi[1]=Nzmienna;
                    lout++; //Zlicza dialogi.
                }
//Znaleziono AI_Output więc szuka osoby.
                for(int c=0, d=0; Znak!=',' && Znak!='\n';)
                {
                    if (tolower(Znak)==Dself[c]) //Szuka dialogów NPC.
                    {
                        Sosoba=Sosoba+Znak;
                        Strm >> Znak;
                        c++;
                    }
                    else if (tolower(Znak)==Dother[d]) //Szuka dialogów bohatera.
                    {
                        Sosoba=Sosoba+Znak;
                        Strm >> Znak;
                        d++;
                    }
                    else
                    {
                        Sosoba="";
                        Strm >> Znak;
                    }
                    if (c==4||d==5) //Wypisuje co znalazł.
                    {
                        if (parm==0)Tdialogi[2]=Sosoba;
                        if (c==4) losel++; //Zlicza dialogi NPC.
                        if (d==5) looth++; //Zlicza dialogi Bohatera.
                    }
                }

//Znalazł AI_Output i/lub osobę więc szuka rozpoczęcia komentarza.

                for (int a=0; Znak!='\n';)
                {
                    if(Znak==kom[a])
                    {
                        Skom = Skom+Znak;
                        Strm >> Znak;
                        a++;
                    }
                    else
                    {
                        Skom="";
                        Strm >> Znak;
                    }
//Znalazł komentarz więc czyta treść aż do końca linii.
                    if (a==2)
                    {
                        if (parm==0)Tdialogi[0] = toStr<int>(linia);
                        for (int b=0; Znak!='\n'&&Znak!='\r';)
                        {
                            if (parm==0) Tdialogi[3]=Tdialogi[3]+Znak;
                            else if (parm==2) Tdialogi[4]=Tdialogi[4]+Znak;
                            Strm >> Znak;
                        }
                    }
                }
            }
        }
    }
}

//-------------------------------- Szukanie dynamicznych opcji dialogowych ---------------------------------------------

void findAddChoice (fstream &Strm, char &Znak, int &linia, int &laddc, int &Laopcdial, string Tdopcjadial[], int parm)
{

    for(int i=0; i!=14;)
    {
        if(tolower(Znak)==Adialog[i]) //Porównuje wczytany znak przekonwertowany na mały z źródłem z tablicy.
        {
            if (parm == 0||parm==2) Sadialog = Sadialog+Znak;
            Strm >> Znak;
            i++;
        }
        else
        {
            if (parm == 0||parm==2) Sadialog="";
            break;
        }
        if (i==14)
        {
            if (parm==0)
            {
                Tdopcjadial[1] = Sadialog;
                Tdopcjadial[0] = toStr<int>(linia);
            }

//Znaleciono polecenie Info_AddChoice więc szuka cudzysłowiu.

            for(int c=0; Znak!=';'&& Znak!='\n';)
            {
                if (Znak=='"')//Znalazł cudzysłów zaczyna czytać treść.
                {
                    Strm>>Znak;
                    for(int g=0; Znak!='"'&&Znak!='\n';)//Kończy czytać jak spotka cudzysłów przecinek lub koniec linii.
                    {
                        if (parm == 0) Tdopcjadial[2]=Tdopcjadial[2]+Znak;
                        else if (parm == 2) Tdopcjadial[3]=Tdopcjadial[3]+Znak;
                        Strm >> Znak;
                    }
                    if (Znak=='"')
                    {
                        if (parm == 0) laddc++; //Zlicza polecenia Info_AddChoice.
                        else if (parm == 1) Laopcdial++;
                        Strm >> Znak;
//                      break;
                    }
                }
                else
                {
                    Strm >> Znak;
                }
            }
        }
    }
}

//--------------------------------------- Szukanie opcji dialogowych ---------------------------------------------------

void findDialoge (fstream &Strm, char &Znak, int &linia, int &ldesc, int &Lopcdial, string Topcjadial[], int parm)
{
    for(int i=0; i!=11;)
    {
        if(tolower(Znak)==Idialog[i]) //Porównuje wczytany znak przekonwertowany na mały z źródłem z tablicy.
        {
            if (parm == 0||parm==2) Idescription = Idescription+Znak;
            Strm >> Znak;
            i++;
        }
        else
        {
            if (parm == 0||parm==2) Idescription="";
            break;
        }
        if (i==11)
        {
            if (parm == 0)
            {
                Topcjadial[1]= Idescription;
                Topcjadial[0]= toStr<int>(linia);
            }

//Znaleziono opcję dialogową więc szuka cudzysłowiu.

            for(int c=0; Znak!=';'&& Znak!='\n';)
            {
                if (Znak=='=')
                {
                    for(int c=0; Znak!=';'&& Znak!='\n' && Znak!='"';)
                    {
                        Strm>>Znak;
                    }
                    if (Znak=='"')//Znalazł cudzysłów zaczyna czytać treść.
                    {
                        if (parm == 0) ldesc++; //Podlicza ilość opcji wyboru.
                        else if (parm == 1) Lopcdial++;
                        Strm>>Znak;
                        for(int g=0; Znak!='"'&&Znak!=';'&&Znak!='\n';)//Kończy czytać jak spotka cudzysłów średnik lub koniec linii.
                        {
                            if (parm == 0) Topcjadial[2]=Topcjadial[2]+Znak;
                            else if (parm == 2) Topcjadial[3]=Topcjadial[3]+Znak;
                            Strm >> Znak;
                        }
                    }
                    else
                    {
                        Strm >> Znak;
                    }
                }
                else
                {
                    Strm>>Znak;
                }
            }
        }
    }
}
